package com.ruoyi.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;


/**
 * @author ChenYF
 * @date 2025-09-11 17:13
 */
public class IDCardGenerator {

    /**
     * 根据生日随机生成18位身份证号码
     *
     * @param birthday 生日日期
     * @return 随机生成的18位身份证号码
     */
    public static String generateIDCard(Date birthday) {
        // 格式化生日为yyyyMMdd
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String birthDayStr = sdf.format(birthday);

        // 随机生成前6位地区码（不保证地区真实性）
        Random random = new Random();
        StringBuilder areaCode = new StringBuilder();
        for (int i = 0; i < 6; i++) {
            areaCode.append(random.nextInt(10));
        }

        // 随机生成后3位顺序码
        StringBuilder sequenceCode = new StringBuilder();
        for (int i = 0; i < 3; i++) {
            sequenceCode.append(random.nextInt(10));
        }

        // 组合前17位
        String first17 = areaCode.toString() + birthDayStr + sequenceCode.toString();

        // 计算校验码
        char checksum = calculateChecksum(first17);

        return first17 + checksum;
    }

    /**
     * 根据身份证前17位计算校验码
     *
     * @param first17 身份证前17位
     * @return 校验码
     */
    private static char calculateChecksum(String first17) {
        if (first17 == null || first17.length() != 17) {
            throw new IllegalArgumentException("前17位身份证号码长度必须为17");
        }

        // 加权因子
        int[] weightingFactors = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        // 校验码对应值
        char[] checksumCodes = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

        int sum = 0;
        for (int i = 0; i < 17; i++) {
            int digit = Character.getNumericValue(first17.charAt(i));
            sum += digit * weightingFactors[i];
        }

        int mod = sum % 11;
        return checksumCodes[mod];
    }

    // 测试示例
    public static void main(String[] args) {
        try {
            // 创建一个生日日期（例如：1990年5月15日）
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date birthday = sdf.parse("1990-05-15");

            // 生成身份证号码
            String idCard = generateIDCard(birthday);
            System.out.println("生成的身份证号码: " + idCard);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
